package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;

public class Affairs {
	// 事务=把连续执行的一系列sql(DML)视为一个整体
	// 开启setAutoCommit(false)--提交commit/回滚rollback
	/**
	 * 事务特性：(ACID) 原子性-Atomicity 强调事务的不可分割 一致性-Consistency 事务执行的前后数据的完整保持一致
	 * 隔离性-Isolation 一个事务 执行过程中，不应该受到其他事务的干扰 持久性-Durability 事务一旦结束，数据就持久到数据库
	 */
	// 有的时候需要把一系列代码作为一个整体执行，但是其中可能会有几句代码有错误
	// 正常执行的时候会造成错误代码之后的部分不执行，如何让这一堆代码全部执行或者全部不执行？

	/**
	    开启事务方法： 在try{}catch{}finally{}中 
	  try{ 
		  conn = DriverManager.getConnection(url,"root",""); 
		  conn.setAutoCommit(false); 							//开启事务
		  ... ... ... 
		  conn.commit(); 										//手动提交事务 
	  }catch(Exception e){ 
		   e.printStackTrace();
		   conn.rollback(); 									//事务回滚,取消修改数据库内容
		   try{ 
		   		conn.rollback(); 
		   }
		   catch(Exception e){
		   		e.printstack();
		   } 
	   }
	 */

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		String s1 = "update person set name='zhangsan1' where code='1001'"; // 根据code修改name字段编程张三
		String s2 = "update person set name='zhangsan2' where code='1002'"; // 根据code修改name字段编程张三
		String s3 = "update person set name='zhangsan3' where code='1003'"; // 根据code修改name字段编程张三

		Class.forName("com.mysql.cj.jdbc.Driver");
		String url = "jdbc:mysql://127.0.0.1:3306/st_211208?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; // 记牢,网络路径，参数
		Connection conn = DriverManager.getConnection(url, "root", "BaiXudemima26");
		PreparedStatement ps = conn.prepareStatement(s1);
		ps.executeUpdate();
		ps = conn.prepareStatement(s2);
		ps.close();
		conn.close();
	}

	// 批量处理--批量执行一些sql，提高执行效率
	// addBatch			添加即将批量处理的数据
	// executeBatch		执行批量处理的数据
	// clearBatch		清空批量处理的数据
	public void test2(Connection conn) throws SQLException {
		long start = System.currentTimeMillis();
		String sql = "insert into person( name,age)values( ? , ? );";
		conn.setAutoCommit(false);
		PreparedStatement ps = conn.prepareStatement(sql);
		for (int i = 1; i <= 1000; i++) {
			ps.setString(1, "B" + i);
			ps.setInt(2, i);
			ps.addBatch();
			//st.addBatch(sql);
		}
		int[] res = ps.executeBatch();// 影响的记录条数
		System.out.println(res.length);
		System.out.println(Arrays.toString(res));
		 ps.clearBatch();
		 conn.commit();
		System.out.println(System.currentTimeMillis()-start);
	}

}
